![]() |
![]() |
|
Seznami in niziDis... kva že?Jeremija ves svoj prosti čas (torej ko ne spi, ko ne toži nad bolečinami, skratka kako minuto na dan) preživi kot moderator na nekem manj znanem forumu, ki ima kar lepo število registriranih uporabnikov, vendar večina med njimi piše same neumnosti. Med takimi je še posebno dejaven Tomaž Majer. Če se zdi Jeremiji objava žaljiva, jo nemudoma zbriše. Če objava na forumu ni žaljiva, ampak je le precej neumna, pa naredi naslednje: Vse samoglasnike odstrani iz besedila in jih (v enakem vrstnem redu) doda nazaj na konec. Na primer sporočilo:
postane
Takó besedilo postane težko berljivo in večina bralcev ga ignorira. Če pa se najde kdo, ki ga vsebina resnično zanima, lahko z nekaj truda razvozla vsebino sporočila. Opisana transformacija besedila je znana pod imenom disemvoweling. 1. podnalogaNapišite funkcijo
Uradna rešitevdef prvi_samoglasnik(niz): """Vrne položaj (indeks) prvega samoglasnika v danem nizu.""" samoglasniki = "aeiouAEIOU" kje = 0 for znak in niz: if znak in samoglasniki: # takoj pri prvem bomo zaključili zadevo return kje kje += 1 return -1 # ni ga bilo 2. podnalogaNapišite funkcijo
Uradna rešitevdef disemvowel(sporocilo): """Desemvowlanje sporočila.""" brez = '' # niz brez samoglasnika samoglasniki = '' # vsi samoglasniki iz niza for c in sporocilo: if c in 'aeiouAEIOU': # gre za samoglasnik samoglasniki += c else: #"običajni" znak brez += c return brez + samoglasniki #zlepimo v pravem redu 3. podnalogaVčasih pa želimo sporočilo dešifrirati, saj nas zanima njegova vsebina.
Ta naloga je vse prej kot enostavna, saj ne vemo kam točno je treba vriniti
izgnane samoglasnike. Sporočilo Bob Rock je na mesta v besedilu, kjer predvideva, da bi morali stati
samoglasniki, vstavil znake Napišite funkcijo
Uradna rešitevdef razveljavi_disemvowel(niz): """Zvezdice v disemvowlanem nizu nadosmesti s samoglasniki s konca niza.""" samoglasnik = 'aeiouAEIOU' seznam_samoglasnikov = [x for x in niz if x in samoglasnik] stevec_samoglasnikov = 0 nov_niz = '' for znak in niz: if znak == '*': nov_niz += (seznam_samoglasnikov[stevec_samoglasnikov]) stevec_samoglasnikov += 1 elif znak in samoglasnik: #smo prišli do konca break else: nov_niz += znak return nov_niz Analiza besedilaPri tej nalogi bomo analizirali nize, ki predstavljajo pravilno slovensko
oblikovane besede in stavke. Pri vseh podnaloge lahko predpostavite, da
so vhodni nizi 1. podnalogaSestavite funkcijo
Uradna rešitevdef stevilo_besed(niz): """V danem nizu prešteje število besed""" st_besed = 1 #štejemo prvo if len(niz) == 0: # vendar je mogoče sploh ni return 0 for znak in niz: if znak == ' ': st_besed += 1 return st_besed 2. podnalogaSestavite funkcijo
Uradna rešitevdef samoglasniki(niz): """Prešteje in vrne število samoglasnikov v danem nizu""" st_samoglasnikov = 0 samoglasniki = 'aeiouAEIOU' for znak in niz: if znak in samoglasniki: st_samoglasnikov += 1 return st_samoglasnikov 3. podnalogaV Pythonu vrstice večvrstičnega niza ločujemo z znakom
Opomba: Python obravnava niz Uradna rešitevdef vrstice(niz): """Vrne seznam vrstic v danem nizu""" return niz.split('\n') 4. podnalogaHaiku (japonsko 俳句) je japonska pesniška oblika iz treh verzov (vrstic), ki obsega sedemnajst zlogov. Prvi in tretji verz imata po pet zlogov, drugi sedem. Na kulturnem natečaju TomoHaiku udeleženci oddajajo svoje izdelke na
strežnik Tomo. Napišite kontrolno funkcijo Predpostavite lahko, da število samoglasnikov v neki besedi ustreza
številu njenih zlogov, ter da niz
Uporabite lahko katero od funkcij, ki ste jih napisali v prejšnjih podnalogah. Uradna rešitevdef haiku(besedilo): """Preveri, ali je v podanem nizu zapisan validen haiku""" if besedilo.count('\n') != 2: # najprej preštejemo vrstice return False i = besedilo.find('\n') # konec prve vrstice j = besedilo.find('\n', i + 1) # konec druge # prva in tretja morate imeti 5, srednja pa 7 samoglasnikov return samoglasniki(besedilo[:i]) == samoglasniki(besedilo[j:]) == 5 and samoglasniki(besedilo[i:j]) == 7 5. podnalogaSestavite funkcijo
Predpostavite, da v nizu ni nobenega znaka Uradna rešitevdef podcrtaj(niz): '''Vrne niz iz dveh vrstic, kjer so ustrezni znaki podčrtani''' prva_vrsta = '' druga_vrsta = '' podcrtujem = False # ali so trenutni znaki podčrtani for znak in niz: if znak == '_': # preklopimo način podčrtovanja podcrtujem = not podcrtujem else: prva_vrsta += znak # v prvi vrsti so vsi znaki razen podčrtajev if podcrtujem: # v drugi pa bodisi presledki, bodisi podčrtaji druga_vrsta += '-' else: druga_vrsta += ' ' return prva_vrsta + '\n' + druga_vrsta 6. podnalogaSestavite funkcijo
Uradna rešitevdef stevilo_znakov(niz): """Prešteje in vrne število znakov, presledki se ne upoštevajo""" st_znakov = sum(1 for znak in niz if znak != ' ') return st_znakov 7. podnalogaSonet je priljubljena pesniška oblika. Sestavljen je iz štirih kitic, pri čemur med vsakima dvema kiticama avtor izpusti eno prazno vrstico. Prvi dve kitici sta štirivrstični — kvartini, drugi dve pa sta trivrstični — tercini. V slovenskem sonetu je standardni verz italijanski (laški) ali jambski enajsterec. To pomeni, da v vsaki vrstici nastopa natanko enajst zlogov. Na kulturnem natečaju TomoSonet udeleženci oddajajo svoje izdelke na
strežnik Tomo. Napiši kontrolno funkcijo
Namig: V slovenskem jeziku število samoglasnikov v neki besedi ustreza številu njenih zlogov. (Obstaja nekaj izjem, ki pa jih bomo zanemarili.) Uradna rešitevdef sonet(besedilo): """Preveri validnost danega soneta in vrne True/False""" # preverimo najprej, če je dovolj vrstic if sum(1 for znak in besedilo if znak == '\n') != 16: return False seznam_vrstic = besedilo.split('\n') if not seznam_vrstic[4] == seznam_vrstic[9] == seznam_vrstic[13] == '': return False #ni praznih vrstic na ustreznih mestih seznam_nepraznih_vrstic = [vrstica for vrstica in seznam_vrstic if vrstica != ''] # preverimo za vsako vrstico, če ima zadostno število samoglasnikov for vrstica in seznam_nepraznih_vrstic: if samoglasniki(vrstica) != 11: return False return True # prišli smo čez vse teste Ujemanja1. podnalogaSestavite funkcijo Niza nimata nujno enakega začetka, lahko se delno ujemata na začetku, lahko se en niz v celoti pojavi na začetku drugega, ali pa sta niza celo enaka. Ni potrebno obravnavati vsakega od teh primerov posebej, samo pazite, da bo funkcija delala pravilno za vse primere.
Pri rešitvi obvezno uporabite zanko Uradna rešitevdef zacetek(a, b): """Prešteje in vrne koliko začetnih znakih se ujemata niza a in b""" stevec = 0 dolzina_krajsega = min(len(a), len(b)) while stevec < dolzina_krajsega and a[stevec] == b[stevec]: stevec += 1 return stevec 2. podnalogaSestavite funkcijo Pri rešitvi ne smete uporabiti zanke Uradna rešitevdef zacetekFor(a, b): """Prešteje in vrne koliko začetnih znakih se ujemata niza a in b""" najkrajsi = min(len(a),len(b)) for i in range(najkrajsi): # ustaviti se moramo, ko krajšega niza zmanjka if a[i] != b[i]: return i # i-ti znak je prvi neujemajoči, ker štejemo od 0 dalje ... return najkrajsi # ujemala sta se v vseh 3. podnalogaNapiši funkcijo Primeri:
Uradna rešitevdef st_ujemanj(beseda1, beseda2): """Prešteje in vrne, koliko istoležnih znakov je enakih""" ujemanja = 0 for i in range(min(len(beseda1), len(beseda2))): # zanka se izvede tolikokrat koliko je dolga najkrajsa beseda b1 oz. b2 if beseda1[i] == beseda2[i]: # ce sta znaka v obeh besedah enaka, se ujemanje poveca za 1. ujemanja += 1 return ujemanja 4. podnalogaNapiši funkcijo Primeri:
Uradna rešitevdef ujeme(beseda1, beseda2): """Vrne niz, kjer je s pikami označeno, v katerih znakih se besedi ne ujemata""" rezultat = "" for i in range(min(len(beseda1), len(beseda2))): if beseda1[i] == beseda2[i]: # ce sta znaka enaka rezultat += beseda1[i] # potem v rezultat dodamo ta znak else: rezultat += "." # sicer dodamo piko. return rezultatMesto objave ob koncu projekta 15.9.2018 |